/**
 * 
 */
package org.compiere.model;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Properties;

import org.compiere.apps.ADialog;
import org.compiere.util.Env;

/**
 * @author Y.Ibrayev
 *
 */
public class CalloutCardLine extends CalloutEngine {

	
	private static String Form11 = "Форма 11";
	private static String Form12 = "Форма 12";
	private static String _2BO = "2БО";
	
	/**
	 * @param ctx context
	 * @param WindowNo current Window No
	 * @param mTab Grid Tab
	 * @param mField Grid Field
	 * @param value New Value
	 * @return null or error message
	 */
	public String unit(Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) {
		String result = null;
		if (value != null) {
			log.info("--- CalloutCardLine.coefficient ---");
			
			// Установка формулы для расчета выходного параметра
			MFormula formula = MBSCCardLine.getFormulaByUnit((String) value);
			if (formula != null) {
				mTab.setValue("BSC_Formula_ID", new Integer(formula.getBSC_Formula_ID()));
			}
			
			// Установка коэффициента, в зависимости от периода
			Integer C_Period_ID = new Integer(Env.getContext(ctx, WindowNo, "C_Period_ID"));
			if (C_Period_ID > 0) {
				MBSCCoefficent coefficent = MBSCCoefficent.getCoefficentByUnit(Env.getCtx(),(String) value, C_Period_ID.intValue());
				if (coefficent != null) {
					mTab.setValue("BSC_Coefficient_ID", coefficent.getBSC_Coefficient_ID());
				}
			}
		}
		return result;
	}
	
	public String fromBSCParameter(Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) {
		String result = null;
		if (value != null) {
			int BSC_Parameter_ID  = ((Integer) value).intValue();
			if (BSC_Parameter_ID > 0) {
				MParameter parameter = new MParameter(Env.getCtx(),BSC_Parameter_ID,null);
				if (parameter != null) {
					String tmpValue = parameter.getName();
					if (mTab.getValue(MBSCCardLine.COLUMNNAME_Name) == null)
						mTab.setValue(MBSCCardLine.COLUMNNAME_Name, tmpValue);
					
					tmpValue = parameter.getDescription();
					mTab.setValue(MBSCCardLine.COLUMNNAME_Description, tmpValue);
					//-->add by Aslanbek 16.11.2013 21-03
					MBSCCard currentCard = new MBSCCard(Env.getCtx(),(int)mTab.getValue(MBSCCard.COLUMNNAME_BSC_Card_ID) , null);
					MPeriod cardPeriod = new MPeriod(Env.getCtx(), currentCard.getC_Period_ID(), null);
					MBSCCardLine cardLine = null;
					if(mTab.dataSave(false))
						cardLine = new MBSCCardLine(ctx, (int)mTab.getValue(MBSCCardLine.COLUMNNAME_BSC_CardLine_ID), null);
					
					if(cardLine.getBSC_Card().getC_Period().getC_Year().getC_Calendar_ID()==1000003
							||cardLine.getBSC_Card().getC_Period().getC_Year().getC_Calendar_ID()==1000002)
					{
						MParameterLine parameterLine = parameter.getParameterLine(cardPeriod);
						if(parameterLine!=null){
							//if(cardLine.getBSC_Card().getC_Period().getC_Year().getC_Calendar_ID()==1000003)
							//{
								mTab.setValue(MBSCCardLine.COLUMNNAME_ValueMax, parameterLine.getValueMax());
								mTab.setValue(MBSCCardLine.COLUMNNAME_ValueMin, parameterLine.getValueMin());
							//}
							if(parameterLine.getValueNumber()!=null)
								mTab.setValue(MBSCCardLine.COLUMNNAME_Value, parameterLine.getValueNumber());
						}
						else
						{
							ADialog.info(25, null, "Значения не найдены на данный период");
						}
					}//<--
//					else if(cardLine.getBSC_Card().getC_Period().getC_Year().getC_Calendar_ID()==1000002)
//					{
//						ArrayList<MParameterLine> parameterLines = parameter.getParameterLine();
//						double parameterLineValue = 0.0;
//						for(MParameterLine parameterLine : parameterLines)
//						{
//							if(parameterLine.getValueNumber()!=null)
//								parameterLineValue = parameterLineValue + Double.valueOf(parameterLine.getValueNumber());
//						}
//						mTab.setValue(MBSCCardLine.COLUMNNAME_Value, String.valueOf(parameterLineValue));
//					}
				}
			}
		}
		return result;
	}
	
	public String fromBPMFormLine(Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) {
		String result = null;
		if (value != null) {
			log.info("--- CalloutCardLine.fromBPMFormLine ---");
			int BPM_FormLine_ID = ((Integer) value).intValue();
			MBPMFormLine formLine = new MBPMFormLine(Env.getCtx(),BPM_FormLine_ID,null);
			
			MBPMFormCode formCode = new MBPMFormCode(Env.getCtx(), formLine.getBPM_Form().getBPM_FormCode_ID(), null);
			
			if (formCode.getName().equals(Form12)) {
				MBPMFormCell[] cells = MBPMFormLine.getLines(Env.getCtx(), BPM_FormLine_ID, null);
				MParameter parameter = new MParameter(Env.getCtx(),cells[1].getBSC_Parameter_ID(),null);
				String tmpValue = parameter.getZeroParameterLine().getValue();
				mTab.setValue(MBSCCardLine.COLUMNNAME_Name, tmpValue);
				
				parameter = new MParameter(Env.getCtx(),cells[2].getBSC_Parameter_ID(),null);
				tmpValue = parameter.getZeroParameterLine().getValue();
				tmpValue = getUnit(tmpValue);
				mTab.setValue(MBSCCardLine.COLUMNNAME_Unit, tmpValue);
	
				parameter = new MParameter(Env.getCtx(),cells[3].getBSC_Parameter_ID(),null);
				tmpValue = parameter.getZeroParameterLine().getValue();
				mTab.setValue(MBSCCardLine.COLUMNNAME_Description, tmpValue);
				
				parameter = new MParameter(Env.getCtx(),cells[4].getBSC_Parameter_ID(),null);
				tmpValue = parameter.getZeroParameterLine().getValue();
				mTab.setValue(MBSCCardLine.COLUMNNAME_ValueMin, new BigDecimal(tmpValue));
			} else if (formCode.getName().equals(Form11)) {
				MBPMFormCell[] cells = MBPMFormLine.getLines(Env.getCtx(), BPM_FormLine_ID, null);
				MParameter parameter = new MParameter(Env.getCtx(),cells[3].getBSC_Parameter_ID(),null);
				String tmpValue = parameter.getZeroParameterLine().getValue();
				mTab.setValue(MBSCCardLine.COLUMNNAME_Name, tmpValue);
				
				parameter = new MParameter(Env.getCtx(),cells[4].getBSC_Parameter_ID(),null);
				tmpValue = parameter.getZeroParameterLine().getValue();
				tmpValue = getUnit(tmpValue);
				mTab.setValue(MBSCCardLine.COLUMNNAME_Unit, tmpValue);
	
				parameter = new MParameter(Env.getCtx(),cells[5].getBSC_Parameter_ID(),null);
				tmpValue = parameter.getZeroParameterLine().getValue();
				mTab.setValue(MBSCCardLine.COLUMNNAME_Description, tmpValue);
				
				parameter = new MParameter(Env.getCtx(),cells[6].getBSC_Parameter_ID(),null);
				tmpValue = parameter.getZeroParameterLine().getValue();
				mTab.setValue(MBSCCardLine.COLUMNNAME_ValueMin, new BigDecimal(tmpValue));
			} else if (formCode.getName().equals(_2BO)) {
				MBPMFormCell[] cells = MBPMFormLine.getLines(Env.getCtx(), BPM_FormLine_ID, null);
				MParameter parameter = null;
				String tmpValue = formLine.getName();
				mTab.setValue(MBSCCardLine.COLUMNNAME_Name, tmpValue);
				
				parameter = new MParameter(Env.getCtx(),cells[5].getBSC_Parameter_ID(),null);
				tmpValue = parameter.getZeroParameterLine().getValue();
				tmpValue = getUnit("tkzt");
				mTab.setValue(MBSCCardLine.COLUMNNAME_Unit, tmpValue);
	/*
				parameter = new MParameter(Env.getCtx(),cells[5].getBSC_Parameter_ID(),null);
				tmpValue = parameter.getZeroParameterLine().getValue();
				tmpValue = getUnit(tmpValue);
				mTab.setValue(MBSCCardLine.COLUMNNAME_Description, tmpValue);
	*/			
				parameter = new MParameter(Env.getCtx(),cells[2].getBSC_Parameter_ID(),null);
				tmpValue = parameter.getZeroParameterLine().getValue();
				mTab.setValue(MBSCCardLine.COLUMNNAME_ValueMin, new BigDecimal(tmpValue));
			}
		}
		return result;
	}
	
	private String getUnit(String value) {
		String result = null;
		if (value.length() > 1 && value.substring(0,2).toLowerCase().equals("шт")) {
			result = "pcs";
		} else if (value.length() > 2 && value.substring(0,3).toLowerCase().equals("кол")) {
			result = "qty";
		} else if (value.length() > 2 && value.substring(0,3).toLowerCase().equals("тыс")) {
			result = "tkzt";
		} else if (value.length() > 2 && value.substring(0,2).toLowerCase().equals("да")) {
			result = "Yes/No";
		} else if (value.length() > 0 && value.substring(0,1).toLowerCase().equals("в")) {
			result = "in_time";
		} else {
			result = value;
		}
		return result;
	}
}
